/**
 * 求[L, R]之间所有二进制位为1的总和
 * 令f(N)为[1, N]之间二进制位为1的总和
 * 可以观察到：
 * 第0位：每2个有1个1
 * 第1位：每4个有2个1
 * 第2位：每8个有4个1
 * ...
 * 因此对每一位计算循环节与剩余即可
 * 应该用右移，这里用了左移所以可能超64位范围，于是用了int28
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;

llt const MOD = 998244353LL;

llt f(llt n){
    llt ans = 0;
    for(__int128_t i=2;i/2<=n;i<<=1){
        llt tmp = (n + 0) / i;
        ans = (ans + tmp * (i / 2) % MOD) % MOD;
        tmp = (n + 0) % i;
        if(tmp + 1 > i / 2) {
            tmp = tmp + 1 - i / 2;
            ans = (ans + tmp) % MOD;
        }
    }
    return ans;
}

llt f(llt a, llt b){
    return ((f(b) - f(a - 1)) % MOD + MOD) % MOD;
}

llt L, R;
void work(){
    cin >> L >> R;
    cout << f(L, R) << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--) work();
    return 0;
}